package cocoaas3{
	import jp.progression.casts.*;
	import jp.progression.commands.display.*;
	import jp.progression.commands.lists.*;
	import jp.progression.commands.managers.*;
	import jp.progression.commands.media.*;
	import jp.progression.commands.net.*;
	import jp.progression.commands.tweens.*;
	import jp.progression.commands.*;
	import jp.progression.data.*;
	import jp.progression.events.*;
	import jp.progression.loader.*;
	import jp.progression.*;
	import jp.progression.scenes.*;
	import caurina.transitions.Tweener;
	import jp.nium.core.debug.Logger;

	import flash.display.*;
	import flash.events.*;
	import flash.net.*;

	import cocoaas3.flash.*;

	public class UITabBarController extends UIViewController{
		//
		//-------------------------------------------------------------------------------------------
		// original variables
		//-------------------------------------------------------------------------------------------
		//
		private var _selectedViewController:UIViewController;
		private var _viewControllers:Vector.<UIViewController> = new Vector.<UIViewController>();
		public function get viewControllers():Vector.<UIViewController>{
			return _viewControllers;
		}

		// The tab bar view associated with this controller. (read-only)
		private var _tabBar:UITabBar;
		public function get tabBar():UITabBar{
			return _tabBar;
		}

		// The index of the view controller associated with the currently selected tab item.
		// ここに index を代入すると、viewControllersのそのシーンに移動
		public function set selectedIndex( val:uint ):void{
			Logger.info( this, "set selectedIndex index="+ val );
			var vc:UIViewController = _viewControllers[val];
			selectedViewController = vc;
		}

		// The view controller associated with the currently selected tab item.
		public function set selectedViewController( val:UIViewController ):void{
			_selectedViewController = val;

			// タブバーの該当アイテムを選択中にする。
			tabBar.selectedItem = val.tabBarItem;

			manager.goto( val.sceneId );
		}

		//
		//-------------------------------------------------------------------------------------------
		// original functions
		//-------------------------------------------------------------------------------------------
		//
    	public function UITabBarController( tabBar:UITabBar ){
    		super( "tbc" );
    		this._tabBar = tabBar;
    		tabBar.delegate = this;
		}


		/**
		 * シーン移動時に目的地がシーンオブジェクト自身もしくは子階層だった場合に、階層が変更された直後に送出されます。
		 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
		 */
		override protected function atSceneLoad():void {
			super.atSceneLoad();
			tabBar.y = manager.stage.stageHeight - 100;
			view.addChild( tabBar );

			container.addChild( view );
		}

		/**
		 * シーンオブジェクト自身が目的地だった場合に、到達した瞬間に送出されます。
		 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
		 */
		override protected function atSceneInit():void {
			super.atSceneInit();
		}

		/**
		 * シーンオブジェクト自身が出発地だった場合に、移動を開始した瞬間に送出されます。
		 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
		 */
		override protected function atSceneGoto():void {
			super.atSceneGoto();
		}

		/**
		 * シーン移動時に目的地がシーンオブジェクト自身もしくは親階層だった場合に、階層が変更される直前に送出されます。
		 * このイベント処理の実行中には、ExecutorObject を使用した非同期処理が行えます。
		 */
		override protected function atSceneUnload():void {
			super.atSceneUnload();
		}









		// Sets the root view controllers of the tab bar controller.
		public function setViewControllers( vec:Vector.<UIViewController>, animated:Boolean=false ):void{
			Logger.info( this, "setViewControllers" );
			_viewControllers = vec;

			
			for( var i:int=0; i<vec.length; i++ ){
				var vc:UIViewController = vec[i];

				// tabBarController をセット
				vc._tabBarController = this;

				// シーンを追加
				addScene( vc );

				// 各 VC に紐付く tabBarItem を作成
				vc.tabBarItem = new UITabBarItem( null, null, i );

				// tabBarItem を tabBar にセット
				tabBar.items.push( vc.tabBarItem );
			}
		}
		
		//
		//-------------------------------------------------------------------------------------------
		// UITabBarDelegate
		//-------------------------------------------------------------------------------------------
		//

		// Receive from the delegate when the user selects a tab bar item. (required)
		public function didSelectItem( tabBar:UITabBar, item:UITabBarItem ):void{
			this.selectedIndex = item.tag;
		}


		//
		//-------------------------------------------------------------------------------------------
		// custom functions
		//-------------------------------------------------------------------------------------------
		//

		public function showTabBar( animated:Boolean=true ):void{
			tabBar.visible = true;
			Tweener.addTween( tabBar, {y:stage.stageHeight-100, time:0.3} );
		}


		public function hideTabBar( animated:Boolean=true ):void{
			var slist = new SerialList();
			slist.addCommand(
				new DoTweener( tabBar, {y:stage.stageHeight+50, time:0.3} ),
				function(){
					tabBar.visible = false;
				},
			null);
			slist.execute();
		}

	}

}